Request bodyのアップロード問題
#トピック
制約の多いウェブサイトから、大きめのファイルをプロキシサーバーにアップロードするためにはどうすればよいか?
たとえばScrapboxでは、Content Security Policyのconnect-src項目の制約によりWeb Fetch APIを直接利用してアップロードすることはできないので、画像URLにデータを埋め込むなどしてアップロードする必要がある
要素のsrcやhref属性に埋め込むアプローチが一番汎用的…?
画像以外の要素で通信することも考えた場合はurlによる手法が一番汎用的っぽい
画像の他にlink,media,iframeなどいろいろある
そのウェブサイトのContent Security Policyのうち、プロキシサーバーと通信可能なものに依存する
URLの長さにはサーバーごとに限界があるので、URLはなるべく短いのが望ましい
encodeURIComponentでエンコーディングされない文字は71種類
これ以外を用いるとエンコーディングされてしまい、2バイトに3文字必要になってURLがめちゃくちゃ長くなってしまう
256の3乗根より、エンコードされてしまった部分はだいたい6種類の文字だけで表したのと同じぐらいの計算になる
一方のbase64は名前の通り64種類を用いる
対数計算により、71種類すべて利用する場合と比べて長さはおよそ1.02倍になることがわかる
許容範囲っぽい
srcに埋め込む方式では、一回のリクエストでせいぜい10kbしか送れない
それ以上のデータは複数のURLに分割して送信することが考えられる
base64を利用するならさらにその75%しか送れない
一回のリクエストを超える場合は少なくとも圧縮を利用すべき
他には、例えばscrapboxではgyazoに画像としてアップロードし、そのurlを送信するという手法が考えられる
サイトそれぞれに許容されるAPIが全く異なることが容易に想像されるので、Scrapbox以外での利用を想定するならあまり魅力的でない